﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Net;
using System.Timers;
using System.Net.NetworkInformation;
using System.Net.NetworkInterface;



namespace _INtactFirewall
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //获取本机的基本信息并且显示到界面上
        static private void Show_BaseIPinformation()
        {
            //先是设计显示本机的主要ip地址作为核心参考的
            string local_hostname= Dns.GetHostName();   //获取本机的host名字
            IPAddress [] iplist = Dns.GetHostAddresses(local_hostname);
            IPAddress temp = null;
            foreach(var ipv4address in iplist)
            {
                if(ipv4address.AddressFamily.ToString() == "InterNetwork")
                {
                    listBoxLocalInfo.Items.Add(ipv4address);
                    temp = ipv4address;
                }
            }
            //T0D0:这个两个分别是本机的host name 和 ip address 需要显示
            //数据类型为 IPAddress类型的
            
            //检查端口是否被占用 显示当前的被占用的端口号
            IPGlobalProperties ipglobalprp = IPGlobalProperties.GetIPGlobalProperties();
            IPEndPoint[] port = ipglobalprp.GetActiveTcpListeners();
            foreach (IPEndPoint endPoint in port) 
            {
                //T0D0:轮番显示endpoint 这个port 相当于一个数组
            }
        }
        
        //获取当前经过的所有流量和应用占用
        //多线程动态显示当前网络流量  实例函数    https://www.cnblogs.com/hdkn235/p/4187925.html
        //这个的窗体要求使用timer组件 动态显示 事件的实例函数也可以调用这个函数处理响应ip更改  https://docs.microsoft.com/en-us/dotnet/api/system.net.networkinformation.networkchange.networkaddresschanged?view=netframework-4.7.2
        static public void OnTimeShowNetworkflow(object sender, ElapsedEventArgs args)
        {
            NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces();
            foreach(NetworkInterface adapter in adapters)
            {
                if(adapter.Supports(NetworkInterfaceComponent.IPv4) == true && adapter.Name == "Ethernet0")
                {
                    //T0D0:显示这个网卡的相关详细信息   adapter.Description adapter.Name /NetworkINterfaceType/Speed
                    //                             
                    //
                    //
                    //
                    //

                    IPInterfaceProperties adapterProperties = adapter.GetIPProperties();
                    IPAddressCollection dns_server = adapterProperties.DnsAddresses;
                    if(dns_server.Count > 0)
                    {
                        foreach(IPAddress dns in dns_server)
                        {
                            //T0D0:显示这个网卡的DNS服务器的IP地址
                        }
                    }
                }

                IPv4InterfaceProperties current_data = adapter.GetIPv4Statistics();
                //T0D0: 显示当前的网卡的IPv4总流量 
                //listBoxAdpterInfo.Items.Add("IPV4已经接收的流量统计：{0} " + data.BytesReceived+ "\n");
                //listBoxAdpterInfo.Items.Add("IPV4已经发送的流量统计：{0} " + data.Bytessent+ "\n");
                //listBoxAdpterInfo.Items.Add("IPV4流量统计：{0} " + data.BytesReceived+ "\n");
            }
        }

        
        //显示当前的ping 信息到组台上
        //当前完成的事件函数  https://docs.microsoft.com/en-us/dotnet/api/system.net.networkinformation.pingcompletedeventargs?view=netframework-4.7.2
        static public void ping_function(object sender,EventArgs args)
        {

            //T0D0: 显示的所有项先清空防止多余的冗余使程序崩溃

            string ipAddress = /*  此处读取控件上键入的信息 */ ;
            //T0D0: 将控件上输入的命令使用Tostring的命令转换成相关的字符串格式
        
            Ping pingSender = new Ping(); //创建新的实例
            PingOptions options = new PingOptions();
            options.DontFragment = false;
            options.Ttl = 50;

            string data = "test data abcabc";
            byte[] buffer = Encoding.ASCII.GetBytes(data);

            //设置超时时间
            int timeout = 120;

            //使用sendASync命令进行ping 
            PingReply reply_infor = pingSender.SendAsync(ipAddress,timeout,buffer);
            if(reply_infor.Status == IPStatus.Success)
            {
                //T0D0: 显示有关信息到组件上   
                //空间上显示有关信息比如说答复的主机地址/往返时间/生存时间/控制数据包的分段/缓冲区大小之类的信息
                //                        reply_infor.Address 
                //                        reply_infor.RoundtripTime
                //                        reply_infor.Options
            }else{

                //T0D0: 显示错误信息到模拟的控制台组件上  

            }
        }


    
    }
}
